{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 用HarvestText自动识别实体及别名，用于实体链接分析\n",
    "\n",
    "要运行这个例子，需要更新HarvestText到V0.7及以上版本\n",
    "```\n",
    "pip install --upgrade harvesttext\n",
    "```\n",
    "\n",
    "并且，在[这里](https://github.com/blmoistawinde/SuperLegal2018Display/raw/master/data/all_comments.txt)下载数据集，放到与本文件同一路径下。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from harvesttext import HarvestText"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "ht = HarvestText()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预览"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0: 特神牛逼\n",
      "\n",
      "1: 请教下，叶尔凡去了哪里？也不见替补哇\n",
      "\n",
      "2: 下场上！\n",
      "\n",
      "3: 11号请在东看台26区找我不见不散！//<a href=\"https://home.zhibo8.cc/user.html?platform=mobile&uid=3348048\">@江苏苏宁俱乐部</a>：下场上！\n",
      "\n",
      "4: 这场看了20分钟就走了。还好是免费的！[笑哭]\n",
      "\n",
      "5: 心疼我的筱婷\n",
      "\n",
      "6: 卡佩罗牛逼，敢上三个U23球员！为你****🐮\n",
      "\n",
      "7: 恭喜特谢拉加入“我奶奶都能进”系列[滑稽][捂脸]\n",
      "\n",
      "8: 视频裁判这么好用居然还有人喷，减少很多争议。耗时间只是刚开始不够专业需要时间来优化。\n",
      "\n",
      "9: 就算耗时间得到公正判罚也值得了。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open(\"all_comments.txt\", encoding=\"utf-8\") as f:\n",
    "    for i, line in enumerate(f):\n",
    "        if i >= 10:\n",
    "            break\n",
    "        print(f\"{i}: {line}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，这里的数据有以下特点：\n",
    "\n",
    "1. 包含了许多原始的网络格式。如HTML，还有@和转发等格式。在处理时保留这些东西可能会导致不鲁棒的程序崩溃，或者挖掘出一些无关实体的副作用，所以需要合理的文本清洗。\n",
    "2. 网络语言的不正规特点，导致对于同一个对象会有不同的称谓，如示例中的“特神”就是球员“特谢拉”的别名。如果要针对实体进行分析，必须要进行规整。\n",
    "\n",
    "处理1需要文本清洗，处理2需要挖掘出人物别名，HarvestText提供了能够方便处理这些问题的接口："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 文本清洗\n",
    "\n",
    "ht.clean_text的默认配置就可以处理这类评论和微博类的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "11号请在东看台26区找我不见不散！ 下场上！\n"
     ]
    }
   ],
   "source": [
    "sample = '11号请在东看台26区找我不见不散！//<a href=\"https://home.zhibo8.cc/user.html?platform=mobile&uid=3348048\">@江苏苏宁俱乐部</a>：下场上！'\n",
    "print(ht.clean_text(sample))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的例子就演示了去除HTML代码，以及回复其他用户的特殊格式\"//@user\"，这些信息一般是无用的干扰信息。\n",
    "\n",
    "函数还提供了更多其他参数，来处理包括：网址；email；html代码中的&nbsp;一类的特殊字符；网址内的%20一类的特殊字符等问题，可以使用help方法来看函数的注释，以及参照[README上的例子](https://github.com/blmoistawinde/HarvestText#%E6%96%87%E6%9C%AC%E6%B8%85%E6%B4%97)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on method clean_text in module harvesttext.harvesttext:\n",
      "\n",
      "clean_text(text, remove_url=True, email=True, weibo_at=True, stop_terms=('转发微博',), emoji=True, weibo_topic=False, deduplicate_space=True, norm_url=False, norm_html=False, to_url=False, remove_puncts=False, remove_tags=True) method of harvesttext.harvesttext.HarvestText instance\n",
      "    进行各种文本清洗操作，微博中的特殊格式，网址，email，html代码，等等\n",
      "    \n",
      "    :param text: 输入文本\n",
      "    :param remove_url: （默认使用）是否去除网址\n",
      "    :param email: （默认使用）是否去除email\n",
      "    :param weibo_at: （默认使用）是否去除微博的\\@相关文本\n",
      "    :param stop_terms: 去除文本中的一些特定词语，默认参数为(\"转发微博\",)\n",
      "    :param emoji: （默认使用）去除\\[\\]包围的文本，一般是表情符号\n",
      "    :param weibo_topic: （默认不使用）去除##包围的文本，一般是微博话题\n",
      "    :param deduplicate_space: （默认使用）合并文本中间的多个空格为一个\n",
      "    :param norm_url: （默认不使用）还原URL中的特殊字符为普通格式，如(%20转为空格)\n",
      "    :param norm_html: （默认不使用）还原HTML中的特殊字符为普通格式，如(\\&nbsp;转为空格)\n",
      "    :param to_url: （默认不使用）将普通格式的字符转为还原URL中的特殊字符，用于请求，如(空格转为%20)\n",
      "    :param remove_puncts: （默认不使用）移除所有标点符号\n",
      "    :param remove_tags: （默认使用）移除所有html块\n",
      "    :return: 清洗后的文本\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(ht.clean_text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面清洗所有文本并保存备用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "特神牛逼\n",
      "请教下，叶尔凡去了哪里？也不见替补哇\n",
      "下场上！\n",
      "11号请在东看台26区找我不见不散！ 下场上！\n",
      "这场看了20分钟就走了。还好是免费的！\n",
      "心疼我的筱婷\n",
      "卡佩罗牛逼，敢上三个U23球员！为你****🐮\n",
      "恭喜特谢拉加入“我奶奶都能进”系列\n",
      "视频裁判这么好用居然还有人喷，减少很多争议。耗时间只是刚开始不够专业需要时间来优化。\n",
      "就算耗时间得到公正判罚也值得了。\n"
     ]
    }
   ],
   "source": [
    "processed_texts = []\n",
    "with open(\"all_comments.txt\", encoding=\"utf-8\") as f:\n",
    "    for line in f:\n",
    "        line = ht.clean_text(line, remove_tags=True)\n",
    "        if len(line) > 0:\n",
    "            processed_texts.append(line)\n",
    "print(\"\\n\".join(processed_texts[:10]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 实体发现与别名挖掘\n",
    "\n",
    "实体的别名之所以会出现，有多种情况：\n",
    "\n",
    "    - 可能是拼写错误（“武磊”经常被写成“吴磊”）\n",
    "    - 是全名缩写等造成的长度变化（“广州恒大淘宝队”, “恒大淘宝队”, “恒大队”, “恒大”）\n",
    "    - 昵称（“特谢拉”, “特神”）\n",
    "    - 其他等等\n",
    "\n",
    "从自然语言处理的角度来看，前两者是一些模式匹配的问题，而昵称的情况，则需要考虑语义来解决。\n",
    "\n",
    "V0.7的HarvestText实现了一种我自己称为\"NFL\"的算法(NER+FastText+Louvain)，参考[Mining Entity Synonyms with Efficient Neural Set Generation](https://arxiv.org/abs/1811.07032v1)一文中提出的其中一种baseline方法。虽然效果不是最佳的，但还算是一种相对快速且精度尚可的算法，而且很重要的是无监督。并且与原文不同的是，原文的实体发现需要基于知识库的entity linking，而这里我则使用NER来完成这一步，因而**彻底摆脱了一切外部数据需求**。我用这一算法来实现基于语义的人物别名挖掘。\n",
    "\n",
    "另外，程序内也实现了一些常见的基于后缀和拼音近似的模式匹配。\n",
    "\n",
    "ht.entity_discover的方法实现实体别名挖掘，设置参数`method=\"NFL\"`就会使用上述语义与模式结合的实体发现与别名挖掘，而使用`method=\"NERP\"`则单纯使用NER+Pattern匹配。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Doing NER\n",
      "100%|██████████| 178290/178290 [01:27<00:00, 2043.79it/s]\n",
      "Pattern matching\n",
      "Training fasttext\n",
      "Louvain clustering\n",
      "Pattern matching\n",
      "Num entities: 2284, Num mentions: 3795\n",
      "Wall time: 2min 34s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "em_dict, et_dict = ht.entity_discover(\"\\n\".join(processed_texts), method=\"NFL\", threshold=0.97)\n",
    "all_mentions = set(x for enty, ments in em_dict.items() for x in ments)\n",
    "print(f\"Num entities: {len(em_dict)}, Num mentions: {len(all_mentions)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在大约2分半的时间内，在178290句话里挖掘出了2240个实体的共3723个别名，还是比较高效的。\n",
    "\n",
    "让我们来看看挖掘出的结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "}, '廖力生_人名': {'廖力生'}, '吉鲁_人名': {'吉鲁'}, '都多_人名': {'都多'}, '尼奥_人名': {'穆里尼奥', '库蒂尼奥', '迪尼奥', '尼奥', '热尔维尼奥', '罗比尼奥'}, '于大宝_人名': {'于大宝'}, '连看_人名': {'连看'}, '那批_人名': {'那批'}, '佩莱_人名': {'佩莱'}, '罗比_人名': {'罗比'}, '强?_人名': {'强?'}, '斯蒂夫_人名': {'斯蒂夫'}, '钱花_人名': {'钱买', '钱花'}, '鲁是_人名': {'鲁是'}, '张思鹏_人名': {'张思鹏'}, '全取_人名': {'全取'}, '奥古斯托_人名': {'奥古斯托'}, '那就更_人名': {'那就更'}, '张文钊_人名': {'张文钊'}, '宫磊_人名': {'宗磊', '宫磊'}, '冠了_人名': {'冠了'}, '比埃拉_人名': {'比埃拉'}, '婷婷_人名': {'婷婷'}, '边了_人名': {'边了'}, '文总_人名': {'文总'}, '胡尔克奥斯卡_人名': {'胡尔克奥斯卡'}, '卡尔德克_人名': {'卡尔德克'}, '德赫亚_人名': {'德赫亚'}, '京鲁_人名': {'京鲁'}, '区一片_人名': {'区一片'}, '克莱奥_人名': {'克莱奥'}, '国安了_人名': {'国安了'}, '欧冠冠军_人名': {'欧冠冠军'}, '么是_人名': {'么是'}, '真球_人名': {'真球'}, '里亚斯_人名': {'里亚斯'}, '那是_人名': {'那是'}, '是永远_人名': {'是永远'}, '胡尔_人名': {'胡尔'}, '张外龙_人名': {'张外龙'}, '斯托伊科维奇_人名': {'斯托伊科维奇'}, '拉维奇_人名': {'拉维奇'}, '邓涵文_人名': {'涵文', '邓涵文', '抱文', '文文'}, '都打_人名': {'都打'}, '陈独秀_人名': {'陈独秀'}, '门将也_人名': {'门将也', '一门将', '门将', '门将可', '门将一'}, '帕莱塔_人名': {'帕莱塔'}, '全看_人名': {'全看'}, '祝恒大_人名': {'祝恒大'}, '么有_人名': {'么有'}, '么?_人名': {'么?'}, '真强_人名': {'真强'}, '曹赟_人名': {'曹赟'}, '顾超_人名': {'顾超'}, '么好_人名': {'么好'}, '蒿俊闵_人名': {'蒿俊闵'}, '冠有望_人名': {'冠有望'}, '程月磊_人名': {'程月磊'}, '多奇_人名': {'多奇'}, '有门将_人名': {'有门将'}, '李金羽_人名': {'李金羽'}, '莫雷诺_人名': {'莫雷诺'}, '才进_人名': {'才进'}, '大力帆_人名': {'大力帆'}, '挺强_人名': {'挺强'}, '雷哥_人名': {'雷哥'}, '王大雷_人名': {'王大雷'}, '都得_人名': {'都得'}, '皮尔洛_人名': {'皮尔洛'}, '奥古斯塔_人名': {'奥古斯塔'}, '黄一万_人名': {'黄一万'}, '平恒大_人名': {'平恒大'}, '那国安_人名': {'那国安'}, '都是谁_人名': {'都是谁'}, '姆巴佩_人名': {'姆巴佩'}, '加兰_人名': {'加兰'}, '单刀_人名': {'单刀'}, '都能_人名': {'都能'}, '于汉超_人名': {'于汉超'}, '塔尔德利那_人名': {'塔尔德利那'}, '权健太_人名': {'权健太'}, '登贝莱_人名': {'登贝莱'}, '拉特那_人名': {'拉特那'}, '巴萨_人名': {'巴萨'}, '武磊牛_人名': {'武磊牛'}, '池文一_人名': {'池文一'}, '真挺_人名': {'真挺'}, '卡拉_人名': {'卡拉'}, '比斯_人名': {'比斯'}, '那脚_人名': {'那脚'}, '兹曼_人名': {'兹曼'}, '巴巴_人名': {'巴巴'}, '平上港_人名': {'平上港'}, '王耀鹏_人名': {'王耀鹏'}, '紫昌_人名': {'紫昌'}, '完赛_人名': {'完赛'}, '辽宁人_人名': {'辽宁人', '济南人'}, '布拉沃_人名': {'布拉沃'}, '哇塞_人名': {'哇塞'}, '郜林和_人名': {'郜林和'}, '秦升_人名': {'秦升'}, '武磊真_人名': {'武磊真'}, '回看_人名': {'回看'}, '圣曾诚_人名': {'圣曾诚'}, '雷腾龙_人名': {'雷腾龙'}, '颜俊凌_人名': {'颜俊凌'}, '青训_人名': {'青训'}, '谢鹏飞_人名': {'谢鹏飞'}, '颜骏_人名': {'颜骏'}, '官宣_人名': {'官宣'}, '谢奎_人名': {'谢奎'}, '萨拉赫_人名': {'萨拉赫'}, '戴帽子_人名': {'戴帽子'}, '拉米雷斯_人名': {'拉米雷斯'}, '许家印_人名': {'许家印'}, '卡洛斯_人名': {'卡洛斯'}, '黄健翔_人名': {'黄健翔'}, '何辉_人名': {'何辉'}, '球打手_人名': {'球打手'}, '刘一鸣_人名': {'刘一鸣', '刘奕鸣'}, '奥斯卡那_人名': {'奥斯卡那'}, '斯托_人名': {'斯托'}, '平国安_人名': {'平国安'}, '瓦罗_人名': {'瓦罗'}, '左路_人名': {'左路'}, '刘殿座_人名': {'刘殿座'}, '国安一_人名': {'国安一'}, '佩特_人名': {'佩特'}, '朴成_人名': {'朴成'}, '少点_人名': {'少点'}, '莫德斯特_人名': {'莫德斯特'}, '崔鹏和_人名': {'崔鹏和'}, '那都_人名': {'那都'}, '开心了_人名': {'开心了'}, '斯特林_人名': {'斯特林'}, '郜林_人名': {'郜林'}, '马丁斯_人名': {'马克斯', '马丁斯'}, '好凉_人名': {'好凉'}, '贝西克塔斯_人名': {'贝西克塔斯'}, '张思_人名': {'张思'}, '夏就没_人名': {'夏就没'}, '保塔镇_人名': {'保塔镇'}, '王永珀_人名': {'王永珀'}, '王总_人名': {'王总'}, '马斯切拉诺_人名': {'马斯切拉诺'}, '拉什福德_人名': {'拉什福德'}, '能力也_人名': {'能力也'}, '都太_人名': {'都太'}, '刚看_人名': {'刚看'}, '索里亚诺_人名': {'索里亚诺'}, '马宁_人名': {'马宁'}, '龟龟_人名': {'龟龟'}, '刘在殿_人名': {'刘在殿'}, '杜佳_人名': {'杜佳', '惠佳康', '惠家康', '柏佳骏', '蔡惠康'}, '才举_人名': {'才举'}, '那新闻_人名': {'那新闻'}, '卡纳瓦罗_人名': {'卡纳瓦罗'}, '全无_人名': {'全无'}, '都比_人名': {'都比'}, '那水平_人名': {'那水平'}, '保级_人名': {'保级'}, '万达影城_人名': {'万达影城'}, '都说_人名': {'都说'}, '国青_人名': {'国青'}, '比达尔_人名': {'比达尔'}, '边卫_人名': {'边网', '边翼', '边卫'}, '那点_人名': {'那点'}, '尤文_人名': {'尤文'}, '都赢_人名': {'都赢'}, '方守门员_人名': {'方守门员'}, '强赛_人名': {'强赛'}, '郭全博_人名': {'郭全博'}, '武磊和_人名': {'武磊和'}, '都还_人名': {'都还'}, '保利_人名': {'保利鸟', '保利'}, '小金子了_人名': {'小金子了'}, '射手了_人名': {'射手了'}, '高水准_人名': {'高水准'}, '赵旭日_人名': {'赵旭日'}, '平球_人名': {'平球'}, '本菲卡_人名': {'本菲卡'}, '赛一轮_人名': {'赛一轮'}, '奥古斯_人名': {'奥古斯'}, '塔尔德利_人名': {'塔尔德里', '塔尔德利'}, '卡尔_人名': {'卡瓦哈尔', '卡尔'}, '一场了_人名': {'一场了'}, '保塔_人名': {'保塔', '保塔郑'}, '马拉多纳_人名': {'马拉多纳'}, '卡瓦尼_人名': {'卡瓦尼'}, '真比_人名': {'真比'}, '连沪_人名': {'连沪'}, '才来_人名': {'才来'}, '方能赢_人名': {'方能赢'}, '向冠军_人名': {'定冠军', '向冠军'}, '都看_人名': {'都看'}, '文筱婷_人名': {'文筱婷'}, '保罗_人名': {'保罗'}, '老子知道_人名': {'老子知道'}, '施密特_人名': {'施密特'}, '才赢_人名': {'才赢'}, '末轮_人名': {'末轮'}, '池文_人名': {'池文'}, '高保塔_人名': {'高保塔'}, '连球_人名': {'连球'}, '金贵_人名': {'吴金贵', '金贵'}, '索萨_人名': {'索萨'}, '刚从_人名': {'刚从', '刚升', '刚想'}, '鬼知道_人名': {'鬼知道'}, '斯科拉里_人名': {'斯科拉里'}, '拉赫_人名': {'拉赫'}, '国安让_人名': {'国安让'}, '小强_人名': {'小强'}, '斯帅_人名': {'斯帅'}, '方打_人名': {'方打'}, '永争_人名': {'永争'}, '少打_人名': {'少打'}, '郑龙_人名': {'郑龙'}, '牛批_人名': {'牛叉', '牛批', '牛笔', '牛比'}, '塔尔_人名': {'塔尔'}, '郜林谁_人名': {'郜林谁'}, '伊沃_人名': {'伊沃'}, '宋黎辉_人名': {'宋黎辉'}, '哈儿_人名': {'哈儿'}, '王上源_人名': {'王上源'}, '少上_人名': {'少上'}, '彭欣_人名': {'彭欣'}, '高比_人名': {'高比'}, '小富即安_人名': {'小富即安'}, '那一球_人名': {'那一球'}, '徐根宝_人名': {'徐根宝'}, '赖谁_人名': {'赖谁'}, '王寿挺_人名': {'王寿挺'}, '施大爷_人名': {'施大爷'}, '阿兰_人名': {'阿兰'}, '都送_人名': {'都送'}, '成也_人名': {'成也'}, '奥斯卡_人名': {'奥斯卡'}, '里瓦尔多_人名': {'里瓦尔多'}, '单鹏飞_人名': {'单鹏飞'}, '连冠_人名': {'连冠', '连冠稳'}, '哈洛_人名': {'哈洛'}, '斯卡_人名': {'利斯卡', '斯卡'}, '卡特_人名': {'卡特'}, '都别_人名': {'都别'}, '都能当_人名': {'都能当'}, '高雷雷_人名': {'高雷雷'}, '王超_人名': {'王超'}, '老焦_人名': {'老焦'}, '健翔_人名': {'健翔'}, '王小平_人名': {'王小平'}, '高球_人名': {'高球', '高俅'}, '全靠_人名': {'全靠'}, '才行_人名': {'才行'}, '张近东_人名': {'张近东'}, '步来_人名': {'步来'}, '鲁治国_人名': {'鲁治国'}, '卡里_人名': {'卡里'}, '亚诺_人名': {'亚森', '亚诺'}, '三都_人名': {'三都'}, '打出翔_人名': {'打出翔'}, '都胜_人名': {'都胜'}, '多多了_人名': {'多多了'}, '才换_人名': {'才换'}, '内马尔_人名': {'内马尔'}, '回追_人名': {'回追'}, '池忠国_人名': {'池忠国'}, '单看_人名': {'单看'}, '全平_人名': {'全平'}, '苏是_人名': {'苏是'}, '塔利斯塔_人名': {'塔利斯塔'}, '向后_人名': {'向后'}, '那恒大_人名': {'那恒大'}, '因扎吉_人名': {'因扎吉'}, '那说_人名': {'那说'}, '扎哈维_人名': {'扎卡维', '扎哈维'}, '盖地虎_人名': {'盖地虎'}, '时候一_人名': {'时候一'}, '才有_人名': {'才有'}, '那一年_人名': {'那一年'}, '梅西来_人名': {'梅西来'}, '国安可_人名': {'国安可'}, '冲甲_人名': {'冲甲'}, '许教授_人名': {'许教授'}, '方首胜_人名': {'方首胜'}, '敢掏_人名': {'敢掏'}, '出翔了_人名': {'出翔了'}, '米兰德比_人名': {'米兰德比'}, '白看_人名': {'白看'}, '都怪_人名': {'都怪'}, '才对_人名': {'才对'}, '张琳芃_人名': {'张琳芃'}, '王了_人名': {'王了'}, '都在骂_人名': {'都在骂'}, '迪亚曼蒂_人名': {'迪亚曼蒂'}, '阿赫利_人名': {'阿赫利'}, '回恒大_人名': {'回恒大'}, '都是球_人名': {'都是球'}, '金敬道_人名': {'金敬道'}, '马大帅_人名': {'马大帅'}, '郑智_人名': {'郑智'}, '乙都_人名': {'乙都'}, '吴兴涵_人名': {'吴兴涵', '兴涵'}, '方发_人名': {'方发'}, '马西卡_人名': {'马西卡'}, '权健_人名': {'权健', '权建', '全健'}, '钱进_人名': {'钱进'}, '佩兰_人名': {'佩兰'}, '乌龙也_人名': {'乌龙也'}, '门德斯_人名': {'门德斯'}, '真心希望_人名': {'真心希望'}, '皇萨_人名': {'皇萨'}, '平是_人名': {'平是'}, '么就_人名': {'么就'}, '毛都没_人名': {'毛都没'}, '泰达也_人名': {'泰达也'}, '全北_人名': {'全北'}, '全怪_人名': {'全怪'}, '费尔南多_人名': {'费尔南多'}, '才问_人名': {'才问'}, '真黑_人名': {'真黑'}, '日夫科_人名': {'日夫科'}, '詹俊强_人名': {'詹俊强'}, '超超_人名': {'超超'}, '米兰_人名': {'米兰'}, '山之战_人名': {'山之战'}, '里卡多_人名': {'里卡多'}, '汉超_人名': {'汉超'}, '都特_人名': {'都特'}, '施蒂_人名': {'施蒂'}, '都懂_人名': {'都懂'}, '安倍晋三_人名': {'安倍晋三'}, '太远了_人名': {'太远了'}, '道坎_人名': {'道坎'}, '马加特_人名': {'马加特'}, '都去_人名': {'都去'}, '权敬源_人名': {'权敬源'}, '拉卡_人名': {'拉卡'}, '都敢_人名': {'都敢'}, '都强_人名': {'都强'}, '程发力_人名': {'程发力'}, '苏鲁_人名': {'苏鲁'}, '奥拉罗尤_人名': {'奥拉罗尤'}, '哈维_人名': {'哈维'}, '斯特尔_人名': {'斯特尔'}, '于恒大_人名': {'于恒大'}, '王彤_人名': {'王彤'}, '才会_人名': {'才会'}, '吉尔_人名': {'吉尔'}, '牛比大_人名': {'牛比大'}, '都有_人名': {'都有'}, '门就_人名': {'门就'}, '都对_人名': {'都对'}, '周海滨_人名': {'周海滨'}, '安安_人名': {'安安'}, '史蒂夫_人名': {'史蒂夫'}, '孙可_人名': {'孙可'}, '都快_人名': {'都快'}, '詹俊和_人名': {'詹俊和'}, '刚哈更_人名': {'刚哈更'}, '木有_人名': {'木有'}, '赛果_人名': {'赛果'}, '郝海东_人名': {'郝海东'}, '刘卫东_人名': {'刘卫东'}, '桓太_人名': {'桓太'}, '庄狗_人名': {'庄狗'}, '老将了_人名': {'老将了'}, '才看_人名': {'才看'}, '崔鹏_人名': {'崔鹏'}, '李学鹏_人名': {'李学鹏'}, '花见_人名': {'花见'}, '郜林真_人名': {'郜林真'}, '么说_人名': {'么说'}, '富力也_人名': {'富力也'}, '鲁也_人名': {'鲁也'}, '多夫_人名': {'多夫'}, '都传_人名': {'都传'}, '贵州_地名': {'贵州'}, '广州塔_地名': {'广州塔'}, '太嫩_地名': {'太行', '太嫩'}, '吉林_地名': {'崇明岛', '甘肃', '阿联', '潍坊', '东吴', '荷兰', '莆田', '朝鲜', '吉林', '朝鲜族', '镇河', '缅甸', '廊坊', '崇明', '瑞典', '滑铁卢', '桂林', '临沂', '淄博', '商丘', '日照', '西方', '江浙', '柬埔寨', '丹麦', '社区', '江津', '安徽', '科隆', '土耳其', '凤凰', '印度', '汉堡', '南美'}, '厦门_地名': {'厦门', '澳门', '津门'}, '济南_地名': {'云南', '西南', '宣城', '南通', '盐城', '绵阳', '南城', '汶川', '南岭', '绿城', '洛阳', '浙江', '信阳', '华南', '沈阳', '海南', '曾城', '辽鲁', '德阳', '西安', '济南', '湖南', '贵阳'}, '一队_地名': {'一队'}, '新东家_地名': {'新东家'}, '太黑_地名': {'太黑'}, '葡萄牙_地名': {'葡萄牙'}, '死里_地名': {'死里'}, '爱大连_地名': {'爱大连'}, '恒大连_地名': {'恒大连'}, '苏北_地名': {'苏北', '湖北'}, '小渔村_地名': {'小渔', '小渔村'}, '新疆_地名': {'新疆', '新乡'}, '老塔_地名': {'老塔'}, '哥伦比亚_地名': {'哥伦比亚'}, '上郑_地名': {'上郑'}, '太高兴_地名': {'太高兴'}, '大名_地名': {'大宝应', '大名', '大牌', '大名单'}, '澳大利亚_地名': {'澳大利亚', '塞维利亚', '塞尔维亚', '尼日利亚'}, '三十年河西_地名': {'三十年河西'}, '阿根廷_地名': {'阿根廷'}, '巴黎_地名': {'巴黎'}, '毕尔巴鄂_地名': {'毕尔巴鄂'}, '虹口_地名': {'虹口', '海口'}, '和上港_地名': {'和上港'}, '老大连_地名': {'老大连'}, '郑州_地名': {'郑州', '杭州', '苏州', '常州'}, '中国_地名': {'英国', '安国', '忠国', '美国', '德国', '中國', '中国', '法国'}, '中原_地名': {'中原'}, '波兰_地名': {'波兰'}, '辽宁_地名': {'辽宁'}, '上海浦东_地名': {'上海浦东'}, '亚洲_地名': {'亚洲'}, '浦和_地名': {'浦和'}, '热苏斯_地名': {'热苏斯'}, '左路_地名': {'左路'}, '大山_地名': {'大山'}, '的塔_地名': {'的塔'}, '四都_地名': {'四都'}, '黑山_地名': {'黑山'}, '山东_地名': {'山东'}, '罗马_地名': {'罗马'}, '陕西_地名': {'广西', '羊城', '西藏', '之城', '江西', '以色列', '烟台', '墨西哥', '皇城', '陕西'}, '人里_地名': {'人里'}, '胜鹿岛_地名': {'胜鹿岛'}, '福海_地名': {'福海'}, '乌斯_地名': {'阿贾克斯', '乌斯', '梅斯'}, '非洲_地名': {'美洲', '非洲', '南美洲', '澳洲'}, '某港_地名': {'某港'}, '克罗地亚_地名': {'克罗地亚'}, '秀山_地名': {'秀山'}, '的城市_地名': {'的城市', '的城'}, '保塔_地名': {'保塔'}, '轮上港_地名': {'轮上港'}, '张牌_地名': {'张牌'}, '西班牙_地名': {'西班牙'}, '多特蒙德_地名': {'多特蒙德'}, '青岛_地名': {'青岛'}, '中国香港_地名': {'中国香港'}, '俄罗斯_地名': {'俄罗斯'}, '上场比赛_地名': {'上场比赛'}, '大连_地名': {'大连', '大连市'}, '下场比赛_地名': {'下场比赛'}, '三队_地名': {'三队', '四队'}, '比大连_地名': {'比大连'}, '热烈祝贺_地名': {'热烈祝贺'}, '瓦尔加_地名': {'瓦尔加'}, '的旗_地名': {'的旗'}, '切里_地名': {'切里', '千里', '沟里'}, '马赛_地名': {'马赛'}, '中华人民共和国_地名': {'中华人民共和国', '中华人民共和'}, '伊拉克_地名': {'伊拉克'}, '一口_地名': {'一口'}, '的上港_地名': {'的上港'}, '亚泰和_地名': {'泰和', '亚泰和'}, '曼萨_地名': {'曼萨'}, '小王子_地名': {'小王子'}, '泰山_地名': {'泰山'}, '比里_地名': {'比里'}, '广州_地名': {'广州', '广州市'}, '比国_地名': {'比国'}, '大贵州_地名': {'大贵州'}, '津巴布韦_地名': {'津巴布韦'}, '秦皇岛_地名': {'秦皇岛'}, '谢场_地名': {'谢场'}, '日本_地名': {'日本'}, '东京_地名': {'东京'}, '切尔西_地名': {'切尔西'}, '成都_地名': {'成都'}, '八星大连_地名': {'八星大连'}, '石家庄_地名': {'石家庄'}, '上格_地名': {'上格'}, '增城_地名': {'增城'}, '京都_地名': {'京都'}, '地球_地名': {'地球'}, '深圳_地名': {'深圳'}, '连平_地名': {'连平'}, '安平_地名': {'安平'}, '无锡_地名': {'无锡', '无利'}, '比上港_地名': {'比上港'}, '长沙_地名': {'长沙', '长安'}, '巴塞罗那_地名': {'罗那', '巴塞罗那'}, '一条街_地名': {'一条街'}, '近角_地名': {'近角'}, '黑上港_地名': {'黑上港'}, '香港_地名': {'香港'}, '博拉_地名': {'博拉'}, '火星_地名': {'火星'}, '中卫_地名': {'中卫'}, '的大连_地名': {'的大连', '和大连'}, '晋西北_地名': {'晋西北'}, '鹿岛_地名': {'鹿岛'}, '宝山_地名': {'宝山'}, '英格兰_地名': {'英格兰'}, '大连台_地名': {'大连台'}, '鸟塔_地名': {'鸟塔'}, '意大利_地名': {'意大利'}, '等上港_地名': {'等上港'}, '那大_地名': {'那大'}, '南京_地名': {'南京'}, '韩国_地名': {'韩国'}, '那能_地名': {'那能'}, '匈牙利_地名': {'匈牙利'}, '国安多_地名': {'国安多'}, '三道_地名': {'三道'}, '捷克_地名': {'捷克'}, '东四_地名': {'东四'}, '和厂州_地名': {'和厂州'}, '埃及_地名': {'埃及'}, '轮亚泰和_地名': {'轮亚泰和'}, '叙利亚_地名': {'叙利亚'}, '右边前卫_地名': {'右边前卫'}, '小塔_地名': {'小塔'}, '轮大连_地名': {'轮大连'}, '广东_地名': {'广东'}, '黑大连_地名': {'黑大连'}, '延边_地名': {'延边'}, '伊朗_地名': {'伊朗'}, '申花都_地名': {'申花都'}, '东亚_地名': {'东亚', '西亚', '马来西亚', '瓦伦西亚', '东南亚'}, '红牌_地名': {'黄牌', '红牌'}, '比利时_地名': {'比利时'}, '中路_地名': {'中路'}, '二队_地名': {'二队'}, '和塔_地名': {'和塔'}, '北京_地名': {'北京', '北京市'}, '海东_地名': {'海东'}, '克鲁_地名': {'克鲁'}, '重庆_地名': {'重庆', '重庆市'}, '福建_地名': {'福建'}, '泰国_地名': {'泰国'}, '过里_地名': {'过里'}, '花钱买_地名': {'花钱买'}, '的贵州_地名': {'的贵州'}, '巴西_地名': {'巴西'}, '长春_地名': {'长春'}, '那不勒斯_地名': {'那不勒斯'}, '加拿大_地名': {'加拿大'}, '内蒙古_地名': {'内蒙古'}, '天津_地名': {'天津市', '天津'}, '比池_地名': {'比池'}, '锦集_地名': {'锦集'}, '红岩_地名': {'红岩'}, '回大连_地名': {'回大连'}, '利物浦_地名': {'利物浦'}, '京津_地名': {'京津'}, '山大_地名': {'山大'}, '东北_地名': {'东北'}, '于海_地名': {'于海'}, '小贵州_地名': {'小贵州'}, '群里_地名': {'群里'}, '宝塔镇_地名': {'宝塔镇'}, '江苏_地名': {'江苏'}, '来大连_地名': {'来大连'}, '的路_地名': {'的路'}, '天都_地名': {'天都'}, '大上港_地名': {'大上港'}, '山东台_地名': {'山东台'}, '上港下_地名': {'上港下'}, '苏宁都_地名': {'苏宁都'}, '上港_地名': {'上港'}, '不水_地名': {'不水'}, '上海滩_地名': {'上海滩'}, '一张牌_地名': {'一张牌'}, '上海_地名': {'上海'}, '黑龙江_地名': {'黑龙江'}, '越秀山_地名': {'越秀山'}, '卡塔尔_地名': {'卡塔尔'}, '河北_地名': {'河北'}, '大苏_地名': {'大苏'}, '越南_地名': {'越南'}, '四川_地名': {'四川'}, '一个城市_地名': {'一个城', '一个城市'}, '晋西_地名': {'晋西'}, '提江_地名': {'提江'}, '哈尔滨_地名': {'哈尔滨'}, '武汉_地名': {'武汉'}, '河南_地名': {'河南'}, '欧洲_地名': {'欧洲'}, '长春队_机构名': {'长春', '长春队'}, '大兄弟_机构名': {'大兄弟'}, '恒大会_机构名': {'恒大会'}, '两场_机构名': {'8场', '三场', '五场', '八场', '四场', '6场', '两场', '4场', '5场', '28场', '2场', '3场'}, '国内球队_机构名': {'国内球队', '国内球'}, '关系吧_机构名': {'关系吧'}, '重庆队_机构名': {'淘宝队', '重庆', '江苏队', '吴队', '建业队', '码头队', '申花队', '母队', '绿队', '深圳队', '辽宁队', '人和队', '俩队', '重庆队'}, '群人_机构名': {'群人', '波人'}, '每个队_机构名': {'每个', '每个球队', '每个队'}, '好大_机构名': {'好大'}, '多吧_机构名': {'多吧'}, '十场_机构名': {'十场'}, '每个人_机构名': {'每个人'}, '输一场_机构名': {'输一场', '胜一场', '输场', '赢一场'}, '现代_机构名': {'现代', '蔚山现代'}, '日本球队_机构名': {'日韩球队', '日本球', '韩国球队', '日本球队', '亚洲球队', '日本队'}, '国安有_机构名': {'国安有'}, '球队有_机构名': {'球队有'}, '小金子进国家队_机构名': {'小金子进国家', '小金子进国家队'}, '自己球队_机构名': {'自己球队', '自己球', '自己队'}, '第二场_机构名': {'第二场'}, '上场_机构名': {'上场'}, '才会_机构名': {'才会'}, '两支球队_机构名': {'四川球队', '两支球队', '两支球', '四支球队'}, '半场_机构名': {'半场'}, '才有_机构名': {'才有', '才会有'}, '中国俱乐部_机构名': {'中国俱乐部', '中国'}, '问题吧_机构名': {'问题吧'}, '中场_机构名': {'中场'}, '新人吧_机构名': {'新人吧'}, '一方会_机构名': {'一方会'}, '对吧_机构名': {'对吧'}, '巴西国家队_机构名': {'巴西国家队', '阿根廷国家队', '韩国国家队', '西班牙国家队', '用国家队', '中国国家队', '罗国家队', '巴西国家', '国家队'}, '人吧_机构名': {'人吧'}, '自己会_机构名': {'自己会'}, '中国赛场_机构名': {'中国赛场'}, '托大_机构名': {'托大'}, '三星_机构名': {'三鹿', '三星'}, '平民球队_机构名': {'平民球', '平民球队'}, '恒大队_机构名': {'恒大队', '恒大!', '恒大', '恒大集团', '恒大淘宝队', '恒大女排'}, '很多人_机构名': {'很多人'}, '对球队_机构名': {'对球', '对球队'}, '来吧_机构名': {'来吧'}, '建业有_机构名': {'建业有'}, '视频组_机构名': {'视频组'}, '欧洲吧_机构名': {'欧洲吧'}, '亚泰有_机构名': {'亚泰有'}, '鸡吧_机构名': {'鸡吧'}, '大连电视台_机构名': {'大连电视台'}, '最有_机构名': {'最有'}, '自己有_机构名': {'自己有'}, '恒大俱乐部_机构名': {'恒大足球俱乐部', '恒大俱乐部', '恒大'}, '强吧_机构名': {'强吧'}, '中国足球有_机构名': {'中国足球有'}, '评论吧_机构名': {'评论吧'}, '有关系_机构名': {'他有关系', '有关系'}, '惨案队_机构名': {'惨案队', '惨案'}, '加油!_机构名': {'加油!'}, '进国家队_机构名': {'进国家', '进国家队'}, '就有_机构名': {'就有', '总有'}, '场吧_机构名': {'场吧'}, '国安会_机构名': {'国安会'}, '单场_机构名': {'单场'}, '博彩公司_机构名': {'博彩', '博彩公司'}, '恒大吧_机构名': {'恒大吧'}, '继续加油吧_机构名': {'继续加油吧'}, '那会_机构名': {'那会'}, '他有_机构名': {'他有'}, '佛系_机构名': {'佛系'}, '新浪_机构名': {'新浪'}, '上半场_机构名': {'下半场', '上半场'}, '送点_机构名': {'送点'}, '贵州兄弟_机构名': {'贵州兄弟'}, '强一点点_机构名': {'强一点点'}, '上港一场_机构名': {'上港一场'}, '吧!_机构名': {'吧!', '吧?'}, '都加油吧_机构名': {'都加油吧'}, '真有_机构名': {'真有'}, '权健队_机构名': {'权健', '权健队'}, '自己俱乐部_机构名': {'自己', '自己俱乐部'}, '甲吧_机构名': {'甲吧'}, '有多大_机构名': {'有多大'}, '恒大一场_机构名': {'恒大一场', '恒大两场'}, '郑队_机构名': {'郑队'}, '一下吧_机构名': {'一下吧'}, '将会_机构名': {'将会'}, '广州队_机构名': {'广州队', '广州'}, '打乒乓球_机构名': {'打乒乓球'}, '裁判队_机构名': {'裁判', '裁判团队', '裁判队'}, '北京队_机构名': {'北京国安队', '北京', '北京队', '北京球队'}, '直播平台_机构名': {'直播平台'}, '裁判吧_机构名': {'裁判吧'}, '中出_机构名': {'中出'}, '权健俱乐部_机构名': {'权健', '权健俱乐部'}, '能力吧_机构名': {'能力吧'}, '百度_机构名': {'百度'}, '国安吧_机构名': {'国安吧'}, '增城强?_机构名': {'增城强?'}, '2．_机构名': {'1．', '2．', '3．', '35*'}, '新王_机构名': {'新王'}, '好点_机构名': {'好点'}, '点吧_机构名': {'点吧'}, '亚洲赛场_机构名': {'亚洲赛场'}, '分吧_机构名': {'分吧'}, '毛关系_机构名': {'毛关系'}, '山东队_机构名': {'山东队', '山东'}, '欧洲俱乐部_机构名': {'欧洲', '欧洲俱乐部'}, '下吧_机构名': {'下吧'}, '裁判问题吧_机构名': {'裁判问题吧'}, '希望两队_机构名': {'希望两', '希望两队'}, '卡拉斯科会_机构名': {'卡拉斯科会'}, '场一场_机构名': {'场两场', '场一场'}, '泰山队_机构名': {'泰山', '泰山队'}, '传控_机构名': {'传控'}, '挺大_机构名': {'挺大'}, '腾讯_机构名': {'腾讯', '网易'}, '张队_机构名': {'张队'}, '一个球队_机构名': {'一支球队', '一个球', '一个球队', '一个队'}, '感觉有_机构名': {'感觉有'}, '好几场_机构名': {'好几场'}, '国家集训队_机构名': {'韩国队', '法国队', '国家集训', '国家集训队', '国际队', '国青队'}, '一点吧_机构名': {'一点吧'}, '地方有_机构名': {'地方有'}, '希望吧_机构名': {'希望吧'}, '河南队_机构名': {'河南队', '河南', '河北队'}, '猪协_机构名': {'猪协'}, '欧洲球队_机构名': {'欧洲球', '欧洲球队'}, '国足_机构名': {'国足'}, '北京人_机构名': {'北京人'}, '亚泰会_机构名': {'亚泰会'}, '直播吧网监平台_机构名': {'直播吧网监平台'}, '中甲球队_机构名': {'中甲球', '中游球队', '中甲球队'}, '回俱乐部_机构名': {'回俱乐部'}, '广州太阳神_机构名': {'广州太阳神'}, '两兄弟_机构名': {'两兄弟'}, '鲁能吧_机构名': {'鲁能吧'}, '富力有_机构名': {'富力有'}, '直播吧_机构名': {'直播吧', '刷直播吧'}, '有木有_机构名': {'有木有'}, '万达影院_机构名': {'万达影院'}, '上海球队_机构名': {'上海队', '上海球队', '上海球'}, '少赛一场_机构名': {'少赛一场'}, '天津人_机构名': {'天津人'}, '视频吧_机构名': {'视频吧'}, '职业球队_机构名': {'业余球队', '职业球', '职业球队'}, '足协会_机构名': {'足协会'}, '西南兄弟_机构名': {'西南兄弟'}, '球队吧_机构名': {'球队吧'}, '国安队_机构名': {'国安球队', '国安队', '国安'}, '小俱乐部_机构名': {'小俱乐部'}, '建业集团_机构名': {'建业集团', '建业'}, '上港会_机构名': {'上港会'}, '可持续健康发展_机构名': {'可持续健康发展'}, '小球队_机构名': {'小球队', '小球', '西南球队'}, '天河体育馆_机构名': {'天河体育馆'}, '上一场_机构名': {'上一场'}, '一两场_机构名': {'一两场'}, '巴西人_机构名': {'巴西人'}, '他吧_机构名': {'他吧'}, '一个人_机构名': {'少一个人', '一个人'}, '十几场_机构名': {'十几场'}, '买人_机构名': {'买人'}, '穆鸟_机构名': {'穆鸟'}, '山东人_机构名': {'山东人'}, '加油吧_机构名': {'加油吧'}, '裁判会_机构名': {'裁判会'}, '人有_机构名': {'人有'}, '很多场_机构名': {'很多场'}, '公平吧_机构名': {'公平吧'}, '自己吧_机构名': {'自己吧'}, '两大_机构名': {'两大'}, '就行_机构名': {'就行'}, '有组织_机构名': {'有组织'}, '地方电视台_机构名': {'地方电视台'}, '手有_机构名': {'手有'}, '广州松日_机构名': {'广州松日'}, '恒大人_机构名': {'恒大人'}, '一点点_机构名': {'一点点'}, '足球吧_机构名': {'足球吧'}, '比利时国家队_机构名': {'比利时国家队', '比利时国家'}, '都有_机构名': {'都有'}, '中国队_机构名': {'中国队', '中国'}, '能力有限_机构名': {'能力有限'}, '近角移动_机构名': {'近角移动'}, '鲁能有_机构名': {'鲁能有'}, '病吧_机构名': {'病吧', '熊吧'}, '前三场_机构名': {'前三场'}, '中国足协_机构名': {'中国猪协', '中国足协'}, '他站_机构名': {'他站'}, '大连足协_机构名': {'大连足协'}, '裁判有_机构名': {'裁判有'}, '感觉会_机构名': {'感觉会'}, '会有_机构名': {'会有'}, '四川全兴_机构名': {'四川全兴'}, '恒太队_机构名': {'恒太队', '恒太'}, '三声_机构名': {'三声'}, '大连市政府_机构名': {'大连市政府'}, '15队_机构名': {'15队', '15'}, '球有_机构名': {'球有'}, '恒大有_机构名': {'恒大有'}, '上大学_机构名': {'上大学'}, '平一场_机构名': {'平一场'}, '两队_机构名': {'两队'}, '恒塔队_机构名': {'恒塔', '恒塔队'}, '放心吧_机构名': {'放心吧'}, '三兄弟_机构名': {'三兄弟'}, '那场_机构名': {'那场'}, '多场_机构名': {'多场'}, '阿里_机构名': {'阿里'}, '中甲吧_机构名': {'中甲吧'}, '兄弟?_机构名': {'兄弟?'}, '方会_机构名': {'方会'}, '建业会_机构名': {'建业会'}, '压人_机构名': {'压人'}, '权健有_机构名': {'权健有'}, '两支队_机构名': {'两支队', '两支'}, '2队_机构名': {'2队'}, '足球俱乐部_机构名': {'足球俱乐部', '足球'}, '今天有_机构名': {'今天有'}, '申花吧_机构名': {'申花吧'}, '一群人_机构名': {'一群人'}, '好吧_机构名': {'号吧', '好吧'}, '重庆兄弟_机构名': {'重庆兄弟'}, '支球队_机构名': {'支球', '支球队'}, '国家队吧_机构名': {'国家队吧'}, '呢?_机构名': {'呢?'}, '足球有_机构名': {'足球有'}, '希望国家队_机构名': {'希望国家', '希望国家队'}, '大半场_机构名': {'大半场'}, '一个四场_机构名': {'一个四场'}, '呢吧_机构名': {'呢吧'}, '深圳平安_机构名': {'深圳平安'}, '比分会_机构名': {'比分会'}, '贵州队_机构名': {'贵州', '贵州队'}, '人会_机构名': {'人才会', '人会'}, '有病吧_机构名': {'有病吧'}, '八万人_机构名': {'八万人'}, '热鸟_机构名': {'热鸟'}, '多人_机构名': {'好多人', '多人'}, '鲁能会_机构名': {'鲁能会'}, '万人_机构名': {'万人'}, '东北路小学_机构名': {'东北路小学'}, '卡拉思科_机构名': {'卡拉思科'}, '高吧_机构名': {'高吧'}, '国际赛场_机构名': {'国际赛场'}, '亚泰吧_机构名': {'亚泰吧'}, '大多数人_机构名': {'大多数人'}, '23国家队_机构名': {'23国家', '23国家队'}, '政治中心_机构名': {'政治中心'}, '有点_机构名': {'有点'}, '建业加油吧_机构名': {'建业加油吧'}, '北京中_机构名': {'北京中'}, '顶级球队_机构名': {'顶级球', '顶级球队'}, '鲁能队_机构名': {'鲁能队', '鲁能'}, '上海国际_机构名': {'上海国际'}, '全北现代_机构名': {'全北现代'}, '职业俱乐部_机构名': {'职业', '职业俱乐部'}, '实力有限_机构名': {'实力有限'}, '下场_机构名': {'下场'}, '第一场_机构名': {'第一场'}, '南京奥体中心_机构名': {'南京奥体中心'}, '第一集团_机构名': {'第一', '第一集团'}, '大连万达_机构名': {'大连万达'}, '天河体育中心_机构名': {'天河体育中心'}, '冲人_机构名': {'冲人'}, '争议大_机构名': {'争议大'}, '一个就行_机构名': {'一个就行'}, '球队会_机构名': {'球队会'}, '上港有_机构名': {'上港有'}, '恒大水军_机构名': {'恒大水军'}, '一声_机构名': {'一声'}, '23?_机构名': {'23?'}, '影响大_机构名': {'影响大'}, '暴力鸟_机构名': {'暴力鸟'}, '中国球队_机构名': {'中国球队', '中国球'}, '巴西队_机构名': {'巴西队', '巴西'}, '上港吧_机构名': {'上港吧'}, '巴萨暴力鸟_机构名': {'巴萨暴力鸟'}, '很多球队_机构名': {'很多球', '很多球队'}, '首都球队_机构名': {'首都球队', '首都球'}, '次吧_机构名': {'次吧'}, '光明_机构名': {'光明'}, '年吧_机构名': {'年吧'}, '大众_机构名': {'大众'}, '草队_机构名': {'草队'}, '一些人_机构名': {'一些人'}, '该有_机构名': {'该有'}, '大连球队_机构名': {'大连球队', '大连球'}, '兄弟球队_机构名': {'兄弟球队', '兄弟球'}, '才行_机构名': {'才行'}, '一场_机构名': {'一场'}, '他会_机构名': {'他会'}, '天津队_机构名': {'天津队', '天津'}, '国家队有_机构名': {'国家队有'}, '就会_机构名': {'就会'}, '黑吧_机构名': {'黑吧'}, '根宝基地_机构名': {'根宝基地'}, '上港队_机构名': {'上港队', '上港'}, '多大_机构名': {'多大'}, '造点_机构名': {'造点'}, '国际足联_机构名': {'国际足联'}, '为球队_机构名': {'为球', '为球队'}, '行吧_机构名': {'行吧'}, '西班牙人_机构名': {'西班牙人'}, '警务站_机构名': {'警务站'}, '同济大学_机构名': {'同济大学'}, '热吧_机构名': {'热吧'}, '中国足球发展_机构名': {'中国足球发展'}, '富力队_机构名': {'富力', '富力队'}, '多点_机构名': {'多点'}, '一方有_机构名': {'一方有'}, '中国女足_机构名': {'中国女足'}, '中央电视台_机构名': {'中央电视台'}, '中国人_机构名': {'中国人'}, '能有_机构名': {'能有'}, '有球队_机构名': {'有球队', '有球'}, '力鸟_机构名': {'力鸟'}, '怪足协_机构名': {'怪足协'}, '百场_机构名': {'百场'}, '上百度_机构名': {'上百度'}, '大连队_机构名': {'大连', '大连队'}, '下课_机构名': {'下课'}, '上港集团_机构名': {'上港', '上港集团'}, '第一人_机构名': {'第一人'}, '务实点_机构名': {'务实点'}, '眼科吧_机构名': {'眼科吧'}, '国青队_机构名': {'国青'}, '中国国家队_机构名': {'中国国家'}, '辽宁队_机构名': {'辽宁'}, '亚洲球队_机构名': {'亚洲球'}, '一支球队_机构名': {'一支球'}, '申花队_机构名': {'申花'}, '一个队_机构名': {'一个'}, '业余球队_机构名': {'业余球'}, '法国队_机构名': {'法国'}, '恒大淘宝队_机构名': {'恒大淘宝'}, '四支球队_机构名': {'四支球'}, '大连市_地名': {'大连'}, '韩国球队_机构名': {'韩国球'}, '建业队_机构名': {'建业'}, '河北队_机构名': {'河北'}, '北京球队_机构名': {'北京球'}, '码头队_机构名': {'码头'}, '阿根廷国家队_机构名': {'阿根廷国家'}, '每个球队_机构名': {'每个球'}, '国际队_机构名': {'国际'}, '人和队_机构名': {'人和'}, '日韩球队_机构名': {'日韩球'}, '韩国国家队_机构名': {'韩国国家'}, '国家队_机构名': {'国家'}, '自己队_机构名': {'自己'}, '江苏队_机构名': {'江苏'}, '韩国队_机构名': {'韩国'}, '重庆市_地名': {'重庆'}, '裁判团队_机构名': {'裁判团'}, '中游球队_机构名': {'中游球'}, '广州市_地名': {'广州'}, '北京市_地名': {'北京'}, '恒大集团_机构名': {'恒大'}, '四川球队_机构名': {'四川球'}, '北京国安队_机构名': {'北京国安'}, '国安球队_机构名': {'国安球'}, '天津市_地名': {'天津'}, '深圳队_机构名': {'深圳'}, '上海队_机构名': {'上海'}, '日本队_机构名': {'日本'}, '淘宝队_机构名': {'淘宝'}, '西班牙国家队_机构名': {'西班牙国家'}, '西南球队_机构名': {'西南球'}, '用国家队_机构名': {'用国家'}, '恒大足球俱乐部_机构名': {'恒大足球'}, '罗国家队_机构名': {'罗国家'}})\n"
     ]
    }
   ],
   "source": [
    "print(em_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "挑一些典型案例看看效果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'武磊', '吴磊'}\n"
     ]
    }
   ],
   "source": [
    "# 拼音的模式匹配得到\n",
    "print(em_dict[\"武磊_人名\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'恒大队', '恒大!', '恒大', '恒大集团', '恒大淘宝队', '恒大女排'}\n"
     ]
    }
   ],
   "source": [
    "# 模式以及语义匹配得到\n",
    "print(em_dict[\"恒大队_机构名\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'郑州', '杭州', '苏州', '常州'}\n",
      "{'巴西国家队', '阿根廷国家队', '韩国国家队', '西班牙国家队', '用国家队', '中国国家队', '罗国家队', '巴西国家', '国家队'}\n"
     ]
    }
   ],
   "source": [
    "# 是错误的匹配，但是很有趣地体现出了语义/字面值的近似\n",
    "print(em_dict[\"郑州_地名\"])\n",
    "print(em_dict[\"巴西国家队_机构名\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 调整知识库\n",
    "\n",
    "尽管挖掘出了很多有意义的别名，但是错误也有很多，要用于后续的可靠挖掘，还可以手工调整。\n",
    "\n",
    "ht提供了保存为易于阅读编辑的格式，并读取的API，用来帮助这个过程。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "ht.save_entity_info('./entity_info_v1.txt', em_dict, et_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "放低_其他专名||其他专名 放低||其他专名\n",
      "\n",
      "捧杀_其他专名||其他专名 捧杀||其他专名 专杀||其他专名\n",
      "\n",
      "更容易_其他专名||其他专名 更早||其他专名 更爽||其他专名 更容易||其他专名\n",
      "\n",
      "双冠王_其他专名||其他专名 双冠王||其他专名\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n\".join(open(\"./entity_info_v1.txt\", encoding=\"utf-8\").readlines(100)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "格式：\n",
    "```\n",
    "entity||类别 mention||类别 mention||类别\n",
    "\n",
    "entity||类别 mention||类别\n",
    "```\n",
    "每行第一个是实体名，其后都是对应的mention名，用一个空格分隔，每个名称后面都对应了其类别。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们选取和编辑一部分的别名，得到entity_info_v2.txt用于后续分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "武磊_人名||人名 武磊||人名 吴磊||人名\n",
      "郜林_人名||人名 郜林||人名\n",
      "上港队_机构名||机构名 上港队||机构名 上港||机构名\n",
      "恒大队_机构名||机构名 恒大||机构名 恒大队||机构名 恒大淘宝队||机构名\n"
     ]
    }
   ],
   "source": [
    "print(open(\"./entity_info_v2.txt\", encoding=\"utf-8\").read())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "defaultdict(<class 'set'>, {'武磊_人名': {'武磊', '吴磊'}, '郜林_人名': {'郜林'}, '上港队_机构名': {'上港队', '上港'}, '恒大队_机构名': {'恒大淘宝队', '恒大队', '恒大'}})\n",
      "{'武磊_人名': '人名', '郜林_人名': '人名', '上港队_机构名': '机构名', '恒大队_机构名': '机构名'}\n"
     ]
    }
   ],
   "source": [
    "# 读取加载入模型\n",
    "ht.load_entities(\"./entity_info_v2.txt\")\n",
    "print(ht.entity_mention_dict)\n",
    "print(ht.entity_type_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 应用\n",
    "\n",
    "有了挖掘出的实体别名和清洗好的文本，我们就可以相对放心的对其进行进一步的挖掘了。\n",
    "\n",
    "ht提供了一些挖掘功能，下面以词频和情感分析为例。上面选取了两个球员和球队，哪个人/球队在球迷心目中更被热议，更受好评呢？\n",
    "\n",
    "### 热议度（词频统计）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'武磊_人名': 3565, '郜林_人名': 1492, '上港队_机构名': 6517, '恒大队_机构名': 13022}\n"
     ]
    }
   ],
   "source": [
    "inv_index = ht.build_index(processed_texts)\n",
    "print(ht.get_entity_counts(processed_texts, inv_index))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 好评度（情感分析）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "武磊_人名的好评度为：0.3005335343653094\n",
      "郜林_人名的好评度为：0.2780580786707832\n",
      "上港队_机构名的好评度为：0.27413765970801507\n",
      "恒大队_机构名的好评度为：0.26715797690707327\n"
     ]
    }
   ],
   "source": [
    "# 使用默认的内置资源建立情感词典，最负面为-1，最正面为+1\n",
    "senti_dict = ht.build_sent_dict(processed_texts, scale=\"+-1\")\n",
    "# 假设实体出现的句子的情感都是体现了对其的情感，所有句子的情感的平均值代表了总体好评度\n",
    "for entity in ht.entity_type_dict:\n",
    "    entity_appeared_docs = ht.search_entity(entity, processed_texts, inv_index)\n",
    "    docs_senti = [ht.analyse_sent(doc) for doc in entity_appeared_docs]\n",
    "    avg_senti = sum(docs_senti) / len(docs_senti)\n",
    "    print(f\"{entity}的好评度为：{avg_senti}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "选取数据所在的赛季，武磊的表现确实比郜林更加出彩，而上港则是力压恒大获得了冠军，与我们的情感分析结果恰好吻合。看来我们做了一个基本正确的情感分析，其基础就是我们之前做的数据清洗以及实体别名发现。\n",
    "\n",
    "进一步还可以实现这样的数据分析：\n",
    "[一文看评论里的中超风云](https://blog.csdn.net/blmoistawinde/article/details/83443196)\n",
    "![2018中超舆情展示系统](https://img-blog.csdnimg.cn/20181027084021173.png)\n",
    "\n",
    "期待大家能够用HarvestText做出更多有趣有用的数据分析项目！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3.6.9 64-bit ('py36': conda)",
   "language": "python",
   "name": "python36964bitpy36conda7217ef5921a74ba4966da93c081ed908"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9-final"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 2
}